package com.zhidisoft.base.dao;

import java.io.Serializable;
import java.util.List;

/**
 * 基础Dao接口，该接口中封装了大部分Dao层对象常用的通用方法
 * @author lx
 *
 * @param <E> -Dao层对象操作的实体类型实际类型
 * @param <PK> -用于表示实体对象主键类型
 */
public interface IBaseDao<E,PK extends Serializable> {
	
	/**
	 * 保存对象到数据库中
	 * @param e -待保存对象
	 * @return -返回保存后对象的主键值
	 */
	PK save(E e);
	
	
	/**
	 * 更新实体对象的方法
	 * @param e -待更新的实体对象，注意，如果数据库中没有对应的记录将抛出StaleStateException异常
	 */
	void update(E e);
	
	
	/**
	 * 删除实体对象在数据库中对应的记录，注意如果数据库中没有对应的记录，将抛出StaleStateException
	 * @param e -待删除实体对象
	 */
	void delete(E e);
	
	/**
	 * 根据主键值删除数据库中对应的记录，不会抛出异常
	 * @param id -待删除数据库记录的主键
	 */
	void delete(PK id);
	
	/**
	 * 根据主键从数据库中获取对应的对象
	 * @param id
	 * @return -返回查询到对象，如果主键不存在，那么将返回null。
	 */
	E get(PK id);
	
	/**
	 * 从数据库中获取当前实体类的对应所有记录
	 * @return
	 */
	List<E> find();
	
	/**
	 * 根据指定的HQL语句查询结果
	 * @param hql -HQL语句，该HQL语句中可以包含"?"占位符，在运行时动态参数绑定
	 * @param args -需要绑定到HQL语句对象的查询参数
	 * @return -返回查询对象的List集合，如果没有查询到对象返回长度为0空集合
	 */
	List<E> find(String hql, Object...args);
	
	/**
	 * 统计当前实体类对应的表中的总记录数
	 * @return
	 */
	Long count();
	
	/**
	 * 按照查询条件统计总记录数
	 * @param hql -统计的HQL语句
	 * @param args -查询参数
	 * @return -返回按条件统计的记录数
	 */
	Long count(String hql, Object...args);
	
	/**
	 * 通用的分页方法
	 * @param pageNumber -当前页码
	 * @param pageSize -当前页要获取的记录数
	 * @param hql -分页的HQL语句
	 * @param args -分页查询的查询参数
	 * @return
	 */
	List<E> findByPage(int pageNumber, int pageSize, String hql, Object...args);
	
	/**
	 * 更新或者保存实体对象
	 * @param e
	 * @return
	 */
	boolean saveOrUpdate(E e);
}
